package com.leng.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class LocationkUtil {

	/**
	 * 
	 * 类名称：NearbyWorkUtil 类描述： 根据指定的经纬度和半径计算附近的经纬度 创建时间：2016年11月10日 上午11:07:01
	 * 修改备注：
	 * 
	 * @version
	 * 
	 */
	public static Float[] getAround(Float latitude, Float longitude, Integer raidus) {

		// Double degree = (24901 * 1609) / 360.0;
		BigDecimal degree = new BigDecimal((24901 * 1609) / 360.0);
		BigDecimal raidusMile = new BigDecimal(raidus);

		BigDecimal dpmLat = BigDecimal.valueOf(1).divide(degree, 5, RoundingMode.CEILING);
		BigDecimal radiusLat = dpmLat.multiply(raidusMile);
		BigDecimal lat = BigDecimal.valueOf(latitude);
		BigDecimal lon = BigDecimal.valueOf(longitude);
		BigDecimal minLat = lat.subtract(radiusLat);
		BigDecimal maxLat = lat.add(radiusLat);

		BigDecimal mpdLng = degree.multiply(BigDecimal.valueOf(Math.cos(latitude * (Math.PI / 180))));
		BigDecimal dpmLng = BigDecimal.valueOf(1).divide(mpdLng, 5, RoundingMode.CEILING);
		BigDecimal radiusLng = dpmLng.multiply(raidusMile);
		BigDecimal minLng = lon.subtract(radiusLng);
		BigDecimal maxLng = lon.add(radiusLng);
		return new Float[] { minLat.floatValue(), maxLat.floatValue(),
				Math.min(minLng.floatValue(), maxLng.floatValue()),
				Math.max(minLng.floatValue(), maxLng.floatValue()) };
	}

	private static double EARTH_RADIUS = 6378.137;
	
	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

	/**
	 * 通过经纬度获取距离(单位：米)
	 * 
	 * @param lat1
	 * @param lng1
	 * @param lat2
	 * @param lng2
	 * @return
	 */
	public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(
				Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000d) / 10000d;
		s = s * 1000;
		return s;
	}

	public static void main(String[] args) {
		System.out.println(getAround(102.0f, 87.0f, 50));
	}
}
